home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CU Amiga Super CD-ROM 17
/
CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso
/
CUCD
/
Graphics
/
RTGmaster
/
demos
/
moon
/
RTGGadgets.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-08-08
|
26KB
|
962 lines
/*
* RTGGadgets V1.2
*
*
* A package to use gadget-like input elements on RTG screens
*
* Copyright © 1996 by Thomas and Hans-Joerg Frieden
* Written by Thomas and Hans-Joerg Frieden
*
* This software may be freely distributed. The copyright remains with
* the copyright holders. For further information, see legal.doc
* In no way may this software be modified without permission of the
* copyright holders.
*
* This software is provided "as is", and may only be used at your own risk.
* The copyright holder and/or the authors can not be held responible for any
* damage the usage of this software may cause. To put it in other words, we are not
* responisble if your cat dies while using this software.
*
* Version Comment
* --------------------------------------------------------------
* 0.1 Initial Version without custom functions
* 1.0 Custom functions inserted
* 1.1 Mouse handling moved to custom input handler, cleanups
* 1.2 Added keypress gadget activation
*
*/
#include <clib/console_protos.h>
#include "global.h"
#include "RTGGadgets.h"
extern struct RTGMasterBase *RTGMasterBase;
extern struct Library *UtilityBase;
struct MsgPort *RTGInputMsgPort;
struct IOStdReq *RTGInputIO;
struct Interrupt InputHandler;
RTGInpRec RTGInputRecord;
struct Device *ConsoleDevice;
struct IOStdReq RTGConsoleIO;
struct InputEvent RTGIe;
struct TagItem mtag[] = {
grd_MouseX, 0,
grd_MouseY, 0,
TAG_DONE, 0
};
struct TagItem ctag[] = {
grd_ColorSpace, 0,
grd_BytesPerRow,0,
TAG_DONE, 0
};
/****** RTGGadgets/CreateRTGGList ******************************************
*
* NAME
* CreateRTGGList -- Create and initialize RTGGList header
*
* SYNOPSIS
* GList = CreateRTGGList( screen, flags)
*
* struct RTGGList *CreateRTGGList( struct RTGScreen *, int);
*
* FUNCTION
* Allocate RTGGList header and initialize it.
*
* INPUTS
* screen = Pointer to an initialized RTGScreen
* flags = flags for this screens gadget list
*
* RESULT
* A pointer to the RTGGList structure, or zero if there was an error
*
*****************************************************************************
*/
struct RTGGList *CreateRTGGList(struct RtgScreen *scr, int flags) {
struct RTGGList *createme;
if (!scr) return(NULL);
createme = malloc(sizeof(struct RTGGList));
if (!createme) return(NULL);
createme->gl_First = NULL;
createme->gl_Hit = NULL;
createme->gl_Selected = NULL;
createme->gl_Screen = scr;
createme->gl_Buffer = 0;
createme->gl_Mode = TRUE;
createme->gl_Flags = flags;
createme->gl_Reset = NULL;
return(createme);
}
/****** RTGGadgets/CreateRTGGadgetA ******************************************
*
* NAME
* CreateRTGGadgetA -- Allocate and initialize an RTG Gadget
*
* SYNOPSIS
* result = CreateRTGGadgetA(list, id, tags);
*
* int CreateRTGGadgetA(struct RTGGList, int, struct TagItem *);
*
* FUNCTION
* Create an RTG Gadget with id in list list
*
* INPUTS
* list - pointer to an RTG gadget list
* id - Unique identification number of this gadget
* tags - pointer to a tag list. The tagitems are as follows:
*
* RGADT_LeftEdge Left edge of gadget (x coordinate)
* RGADT_TopEdge Top edge of gadget (y coordinate)
* RGADT_Width Width of gadget
* RGADT_Height Height of gadget
* RGADT_Flags Flags. See below.
* RGADT_HitTest Custom function for hit testing
* RGADT_HitRender Custom function for rendering hit gadget
* RGADT_DownRender Custom function for rendering pressed gadget
* RGADT_UpRender Custom function for rendering depressed gadget
* RGADT_Force Force this gadet id. Error if already present
* RGADT_HitPen Set the hit pen for the standard renderer
* RGADT_UpPen Set up pen
* RGADT_DownPen Set down pen
* RGADT_Key key to activate gadget
*
*
* The flags field can have the following values:
*
* RGADF_HITHILITE The gadget is hihglited when the mouse is
* positioned above it.
*
* RESULT
* The result is the gadgets id, or -1 if ther was an error.
* An error also occurs if the gadget`s id was already in use while
* setting the RGADT_Force tag to TRUE.
*
* NOTE
* The key to activate the gadget is the latin 1 representation, not
* the rawkey code.
*
*****************************************************************************
*/
int CreateRTGGadgetA(struct RTGGList *list, int id, struct TagItem *tags) {
struct TagItem *tag;
struct TagItem *tstate;
struct RTGGadget *do_me;
struct RTGGadget *akt;
BOOL force = TRUE;
BOOL fail = FALSE;
if (!list) return(-1);
GetRtgScreenData(list->gl_Screen, ctag);
do_me = malloc(sizeof(struct RTGGadget));
if (!do_me) return(-1);
do_me->rg_ID = id; // Default values
do_me->rg_Left = 0;
do_me->rg_Top = 0;
do_me->rg_Width = 8;
do_me->rg_Height = 8;
do_me->rg_Flags = 0;
do_me->rg_HitTest = NULL;
do_me->rg_HitRender = NULL;
do_me->rg_DownRender= NULL;
do_me->rg_UpRender = NULL;
do_me->rg_UserData = NULL;
do_me->rg_ExtHandle = NULL;
do_me->rg_Key = 0;
switch (ctag[0].ti_Data) {
case grd_Palette:
do_me->rg_HitPen = 1;
do_me->rg_DownPen = 2;
do_me->rg_UpPen = 3;
break;
default:
do_me->rg_HitPen = 0x0f00;
do_me->rg_DownPen = 0x00f0;
do_me->rg_UpPen = 0x0fff;
break;
}
// Now parse tag list
tstate = tags;
while ( tag = NextTagItem(&tstate)) {
switch (tag->ti_Tag) {
case RGADT_LeftEdge:
do_me->rg_Left = (int)(tag->ti_Data);
break;
case RGADT_TopEdge:
do_me->rg_Top = (int)(tag->ti_Data);
break;
case RGADT_Width:
do_me->rg_Width = (int)(tag->ti_Data);
break;
case RGADT_Height:
do_me->rg_Height = (int)(tag->ti_Data);
break;
case RGADT_Flags:
do_me->rg_Flags = (int)(tag->ti_Data);
break;
case RGADT_HitTest:
do_me->rg_HitTest = (void *)(tag->ti_Data);
break;
case RGADT_HitRender:
do_me->rg_HitRender = (void *)(tag->ti_Data);
printf("Read: %x, Inserted: %x\n",tag->ti_Data, do_me->rg_HitRender);
break;
case RGADT_DownRender:
do_me->rg_DownRender = (void *)(tag->ti_Data);
break;
case RGADT_UpRender:
do_me->rg_UpRender = (void *)(tag->ti_Data);
break;
case RGADT_Force:
force = (BOOL)(tag->ti_Data);
break;
case RGADT_HitPen:
do_me->rg_HitPen = (int)(tag->ti_Data);
break;
case RGADT_UpPen:
do_me->rg_UpPen = (int)(tag->ti_Data);
break;
case RGADT_DownPen:
do_me->rg_DownPen = (int)(tag->ti_Data);
break;
case RGADT_UserData:
do_me->rg_UserData = (APTR)(tag->ti_Data);
break;
case RGADT_Key:
do_me->rg_Key = (char)(tag->ti_Data);
break;
} // switch
} // while
if (!list->gl_First) {
list->gl_First = do_me;
do_me->rg_Next = NULL;
return(id);
}
akt = list->gl_First; // Scan the gadget list
while (akt->rg_Next) {
if (akt->rg_ID == id) { // id already in use
if (force) {
fail = TRUE;
break;
} else
id = INT_MAX;
}
if (akt->rg_Next->rg_ID > id) // insert here
break;
akt = akt->rg_Next;
}
if (fail) { // We already have this id
free(do_me); // and want to enforce it, so
return(-1); // we fail :(
}
if (id == INT_MAX) { // if id was already in use
id = akt->rg_ID + 1; // use the next free one
do_me->rg_ID = id;
}
do_me->rg_Next = akt->rg_Next; // Put it into the list
akt->rg_Next = do_me;
return(id);
}
int CreateRTGGadget(struct RTGGList *list, int id, Tag tags, ...) {
return (CreateRTGGadgetA(list, id, (struct TagItem *)&tags));
}
/****** RTGGadgets/DeleteRTGGadget ******************************************
*
* NAME
* DeleteRTGGadget -- Delete an RTG gadget from the list
*
* SYNOPSIS
* id = DeleteRTGGadget(list, id);
*
* int DeleteRTGGadget(struct RTGGList, int);
*
* FUNCTION
* Delete RTG gadget from list.
*
* INPUTS
* list - pointer to a struct RTGGList
* id - identification number of the gadget to be deleted
*
* RESULT
* The result is the id of the removed gadget.
*
*****************************************************************************
*/
int DeleteRTGGadget(struct RTGGList *list, int id) {
struct RTGGadget *akt;
struct RTGGadget *killme;
if (!list) return(-1);
if (!list->gl_First) // List is empty
return(-1);
akt = list->gl_First; // Search in list
if (akt->rg_ID != id) {
while(akt->rg_Next) {
if (akt->rg_Next->rg_ID == id)
break;
akt = akt->rg_Next;
}
}
if (!akt->rg_Next) // Not found
return(-1);
killme = akt->rg_Next;
akt->rg_Next = akt->rg_Next->rg_Next;
free(killme);
return(id);
}
/****** RTGGadgets/RTGGHitTest ******************************************
*
* NAME
* RTGGHitTest -- Test gadget hitbox against mouse coordinates
*
* SYNOPSIS
* RTGGHitTest(akt, x, y);
*
* int RTGGHitTest(struct RTGGadget *, int, int);
*
* FUNCTION
* This function tests if the point given by x,y is inside the gadget`s
* hit box.
* This function is called automatically by RefreshRTGGList.
* It can be replaced by a user-defined function for more complicated
* or special cases.
*
* INPUTS
* akt - Gadget to test
* x - x coordinate of test point
* y - y coordinate of test point
*
* RESULT
* 0 - no hit
* 1 - hit
*
* NOTES
*
*
*****************************************************************************
*
*/
int RTGGHitTest(struct RTGGadget *akt, int x, int y) {
if (!akt) return(0);
if (akt->rg_HitTest) {
return(akt->rg_HitTest(akt, x, y));
}
if (x <= akt->rg_Left) return(0);
if (x >= akt->rg_Left + akt->rg_Width) return(0);
if (y <= akt->rg_Top) return(0);
if (y >= akt->rg_Top + akt->rg_Height) return(0);
return(1);
}
/*
*
* DrawRTGBox
*
*/
void DrawRTGBox(struct RtgScreen *scr, APTR badr, int x, int y, int w, int h, char c) {
int i;
int bpr;
char *l1, *l2;
GetRtgScreenData(scr, ctag);
bpr = ctag[1].ti_Data;
l1 = (char *)(y * bpr + x + (char *)badr);
l2 = (char *)((y + h) * bpr + x+ (char *)badr) ;
for(i = 0; i < w; i++) {
*l1 = c;
*l2 = c;
l1++; l2 ++;
}
l1 = (char *)(y * bpr + x + (char *)badr);
l2 = (char *)(y * bpr + x + w + (char *)badr);
for(i = 0; i <= h; i++) {
*l1 = c;
*l2 = c;
l1 += bpr;
l2 += bpr;
}
}
/****** RTGGadget/RTGGHitRender ******************************************
*
* NAME
* RTGGHitRender -- Render gadget in hit position
*
* SYNOPSIS
* RTGGHitRender(list, akt);
*
* RTGGHitRender(struct RTGGlist *, struct RTGGadget *);
*
* FUNCTION
* Render gadget in hit position (i.e. pointer is over gadget)
* This function is called by RefreshRTGGList.
* It can be replaced by a custom function.
*
* INPUTS
* list - pointer ot gadget list
* akt - pointer to gadget
*
*
*****************************************************************************
*
*/
void RTGGHitRender(struct RTGGList *list, struct RTGGadget *akt) {
APTR badr;
int x,y,w,h;
if (!list) return;
if (!(akt->rg_Flags & RGADF_HITHILITE)) return;
if (akt->rg_HitRender) {
akt->rg_HitRender(list, akt);
return;
}
GetRtgScreenData(list->gl_Screen, ctag);
badr = GetBufAdr(list->gl_Screen, list->gl_Buffer);
x = akt->rg_Left;
y = akt->rg_Top;
w = akt->rg_Width;
h = akt->rg_Height;
if (ctag[0].ti_Data == grd_Palette) {
/* DrawRtgLine(list->gl_Screen, badr, akt->rg_HitPen, x, y, x+w, y);
DrawRtgLine(list->gl_Screen, badr, akt->rg_HitPen, x, y+h, x+w, y+h);
DrawRtgLine(list->gl_Screen, badr, akt->rg_HitPen, x, y, x, y+h);
DrawRtgLine(list->gl_Screen, badr, akt->rg_HitPen, x+w, y, x+w, y+h);*/
DrawRTGBox(list->gl_Screen, badr, x, y, w, h, akt->rg_HitPen);
} else {
DrawRtgLineRGB(list->gl_Screen, badr, akt->rg_HitPen, x, y, x+w, y);
DrawRtgLineRGB(list->gl_Screen, badr, akt->rg_HitPen, x, y+h, x+w, y+h);
DrawRtgLineRGB(list->gl_Screen, badr, akt->rg_HitPen, x, y, x, y+h);
DrawRtgLineRGB(list->gl_Screen, badr, akt->rg_HitPen, x+w, y, x+w, y+h);
}
}
/****** RTGGadget/RTGGDownRender ******************************************
*
* NAME
* RTGGDownRender -- Render gadget in down position
*
* SYNOPSIS
* RTGGDownRender(list, akt);
*
* RTGGDownRender(struct RTGGlist *, struct RTGGadget *);
*
* FUNCTION
* Render gadget in down position (i.e. pointer is over gadget and
* button pressed).
* This function is called by RefreshRTGGList.
* It can be replaced by a custom function.
*
* INPUTS
* list - pointer ot gadget list
* akt - pointer to gadget
*
*
*****************************************************************************
*
*/
void RTGGDownRender(struct RTGGList *list, struct RTGGadget *akt) {
APTR badr;
int x,y,w,h;
if (!list) return;
if (akt->rg_DownRender) {
akt->rg_DownRender(list, akt);
return;
}
GetRtgScreenData(list->gl_Screen, ctag);
badr = GetBufAdr(list->gl_Screen, list->gl_Buffer);
x = akt->rg_Left;
y = akt->rg_Top;
w = akt->rg_Width;
h = akt->rg_Height;
if (ctag[0].ti_Data == grd_Palette) {
/* DrawRtgLine(list->gl_Screen, badr, akt->rg_DownPen, x, y, x+w, y);
DrawRtgLine(list->gl_Screen, badr, akt->rg_DownPen, x, y+h, x+w, y+h);
DrawRtgLine(list->gl_Screen, badr, akt->rg_DownPen, x, y, x, y+h);
DrawRtgLine(list->gl_Screen, badr, akt->rg_DownPen, x+w, y, x+w, y+h);*/
DrawRTGBox(list->gl_Screen, badr, x, y, w, h, akt->rg_DownPen);
} else {
DrawRtgLineRGB(list->gl_Screen, badr, akt->rg_DownPen, x, y, x+w, y);
DrawRtgLineRGB(list->gl_Screen, badr, akt->rg_DownPen, x, y+h, x+w, y+h);
DrawRtgLineRGB(list->gl_Screen, badr, akt->rg_DownPen, x, y, x, y+h);
DrawRtgLineRGB(list->gl_Screen, badr, akt->rg_DownPen, x+w, y, x+w, y+h);
}
}
/****** RTGGadget/RTGGUpRender ******************************************
*
* NAME
* RTGGUpRender -- Render gadget in up position
*
* SYNOPSIS
* RTGGUpRender(list, akt);
*
* RTGGUpRender(struct RTGGlist *, struct RTGGadget *);
*
* FUNCTION
* Render gadget in down position (i.e. pointer is not over gadget).
* This function is called by RefreshRTGGList.
* It can be replaced by a custom function.
*
* INPUTS
* list - pointer ot gadget list
* akt - pointer to gadget
*
*****************************************************************************
*
*/
void RTGGUpRender(struct RTGGList *list, struct RTGGadget *akt) {
APTR badr;
int x,y,w,h;
if (!list) return;
if (akt->rg_UpRender) {
akt->rg_UpRender(list, akt);
return;
}
GetRtgScreenData(list->gl_Screen, ctag);
badr = GetBufAdr(list->gl_Screen, list->gl_Buffer);
x = akt->rg_Left;
y = akt->rg_Top;
w = akt->rg_Width;
h = akt->rg_Height;
if (ctag[0].ti_Data == grd_Palette) {
/* DrawRtgLine(list->gl_Screen, badr, akt->rg_UpPen, x, y, x+w, y);
DrawRtgLine(list->gl_Screen, badr, akt->rg_UpPen, x, y+h, x+w, y+h);
DrawRtgLine(list->gl_Screen, badr, akt->rg_UpPen, x, y, x, y+h);
DrawRtgLine(list->gl_Screen, badr, akt->rg_UpPen, x+w, y, x+w, y+h);*/
DrawRTGBox(list->gl_Screen, badr, x, y, w, h, akt->rg_UpPen);
} else {
DrawRtgLineRGB(list->gl_Screen, badr, akt->rg_UpPen, x, y, x+w, y);
DrawRtgLineRGB(list->gl_Screen, badr, akt->rg_UpPen, x, y+h, x+w, y+h);
DrawRtgLineRGB(list->gl_Screen, badr, akt->rg_UpPen, x, y, x, y+h);
DrawRtgLineRGB(list->gl_Screen, badr, akt->rg_UpPen, x+w, y, x+w, y+h);
}
}
/****** RTGGadgets/RefreshRTGGList ******************************************
*
* NAME
* RefreshRTGGList -- Refresh and redraw list of gadgets
*
* SYNOPSIS
* RefreshRTGGList(list)
*
* void RefreshRTGGList(struct RTGGList *);
*
* FUNCTION
* Refresh the state of the gadgets in list list and redraw everything.
*
* INPUTS
* list - pointer to an RTGGList
*
*****************************************************************************
*/
void RefreshRTGGList(struct RTGGList *list) {
struct RTGGadget *akt;
int x,y;
BYTE buffer[10];
if (!list) return;
GetRtgScreenData(list->gl_Screen, mtag); // Read mouse
x = mtag[0].ti_Data;
y = mtag[1].ti_Data;
if (!list->gl_First) return;
if (list->gl_Reset) {
RTGGUpRender(list, list->gl_Reset);
list->gl_Reset = NULL;
}
if (RTGInputRecord.LastKey != 0) { // Key was pressed
RTGIe.ie_NextEvent = NULL;
RTGIe.ie_Class = IECLASS_RAWKEY;
RTGIe.ie_Code = RTGInputRecord.LastKey;
RTGIe.ie_Qualifier = 0;
RTGIe.ie_position.ie_addr = NULL;
RawKeyConvert(&RTGIe, buffer, 10, NULL);
RTGInputRecord.LastKey = 0;
for(akt = list->gl_First; akt; akt = akt->rg_Next) {
if (akt->rg_Key == buffer[0]) {
list->gl_Selected = akt;
RTGGDownRender(list, akt);
list->gl_Reset = akt;
}
}
}
for(akt = list->gl_First; akt; akt = akt->rg_Next) // Find akt
if (RTGGHitTest(akt, x, y)){
break;
}
if (akt) {
if (list->gl_Mode) { // UpMode
if (akt != list->gl_Hit) {
if (list->gl_Hit) RTGGUpRender(list, list->gl_Hit);
RTGGHitRender(list, akt);
list->gl_Hit = akt;
}
} else { // DownMode
if ((list->gl_Hit) && RTGGHitTest(list->gl_Hit, x, y)) {
RTGGDownRender(list, list->gl_Hit);
} else {
if (list->gl_Hit) RTGGUpRender(list, list->gl_Hit);
}
}
} else {
if (list->gl_Hit) RTGGUpRender(list, list->gl_Hit);
if (list->gl_Mode) list->gl_Hit = 0;
}
if (RTGInputRecord.MK1) {
list->gl_Mode = FALSE; // DownMode
list->gl_Hit = akt;
RTGInputRecord.MK1 = 0;
}
if (RTGInputRecord.UK1) {
list->gl_Mode = TRUE; // UpMode
RTGInputRecord.UK1 = 0;
if (akt == list->gl_Hit) {
list->gl_Selected = list->gl_Hit;
list->gl_Hit = NULL;
if (list->gl_Selected) RTGGUpRender(list, list->gl_Selected);
}
}
}
/****** RTGGadgets/DeleteRTGGList ******************************************
*
* NAME
* DeleteRTGGList -- Delete a list of RTG gadgets
*
* SYNOPSIS
* success = DeleteRTGGList(list, force);
*
* BOOL DeleteRTGGList(struct RTGGList *, BOOL);
*
* FUNCTION
* Delete a list of RTG gadgets, including the list header.
*
* INPUTS
* list - a pointer to the RTGGList structure to be deleted
* force - a boolean flag to force the list to be deleted, even if there
* are gadgets left in it.
*
* RESULT
* a boolean value of TRUE indicates successful deletion.
*
*****************************************************************************
*/
BOOL DeleteRTGGList(struct RTGGList *list, BOOL force) {
struct RTGGadget *akt;
struct RTGGadget *next;
if (!list) return(TRUE);
if ((!force) && (list->gl_First)) return(FALSE); // not enforced, and still gadgets in list
akt = list->gl_First;
while (akt) {
next = akt->rg_Next;
free(akt);
akt = next;
}
free(list);
return(TRUE);
}
/****** RTGGadgets/RTGGAddIPH ******************************************
*
* NAME
* RTGGAddIPH -- Add Input handler to system
*
* SYNOPSIS
* RTGGAddIPH();
*
* void RTGGAddIPH(void);
*
* FUNCTION
* Install input handler
*
* INPUTS
*
* RESULT
*
*****************************************************************************
*/
void RTGGAddIPH(void) {
extern void HandlerCode();
InputHandler.is_Code = HandlerCode;
InputHandler.is_Data = &RTGInputRecord;
InputHandler.is_Node.ln_Pri=100;
InputHandler.is_Node.ln_Name="mygame input handler";
RTGInputIO->io_Data = (APTR)&InputHandler;
RTGInputIO->io_Command = IND_ADDHANDLER;
DoIO((struct IORequest *)RTGInputIO);
RTGInputRecord.MK1 = 0;
RTGInputRecord.UK1 = 0;
RTGInputRecord.LastKey = 0;
}
/****** RTGGadgets/RTGGRemIPH ******************************************
*
* NAME
* RTGGRemIPH -- Remove input handler
*
* SYNOPSIS
* RTGGRemIPH();
*
* void RTGGRemIPH(void);
*
* FUNCTION
* Install input handler
*
* INPUTS
*
* RESULT
*
*****************************************************************************
*/
void RTGGRemIPH(void) {
RTGInputIO->io_Data = (APTR)&InputHandler;
RTGInputIO->io_Command = IND_REMHANDLER;
DoIO((struct IORequest *)RTGInputIO);
}
/****** RTGGadgets/RTGGOpenInput ******************************************
*
* NAME
* RTGGOpenInput -- Open input device
*
* SYNOPSIS
* RTGGOpenInput;
*
* void RTGGOpenInput(void);
*
* FUNCTION
* Open input device
*
* INPUTS
*
* RESULT
*
*****************************************************************************
*/
BOOL RTGGOpenInput(void) {
BYTE error;
RTGInputMsgPort = CreatePort(0L, 0L);
if (!RTGInputMsgPort)
return(FALSE);
RTGInputIO = (struct IOStdReq *) CreateExtIO(RTGInputMsgPort, sizeof(struct IOStdReq));
if (!RTGInputIO) {
DeletePort(RTGInputMsgPort);
return(FALSE);
}
error = OpenDevice((STRPTR)"input.device", 0L, (struct IORequest *)RTGInputIO, 0);
if (error) {
DeleteExtIO((struct IORequest *)RTGInputIO);
DeletePort(RTGInputMsgPort);
return(FALSE);
}
error = OpenDevice("console.device", -1, (struct IORequest *)&RTGConsoleIO, 0L);
if (error) {
CloseDevice((struct IORequest *)RTGInputIO);
DeleteExtIO((struct IORequest *)RTGInputIO);
DeletePort(RTGInputMsgPort);
return(FALSE);
}
ConsoleDevice = (struct Device *)RTGConsoleIO.io_Device;
return(TRUE);
}
/****** RTGGadgets/RTGGCloseInput ******************************************
*
* NAME
* RTGGCloseInput -- Close input device
*
* SYNOPSIS
* RTGGCloseInput;
*
* void RTGGCloseInput(void);
*
* FUNCTION
* Close input device
*
* INPUTS
*
* RESULT
*
*****************************************************************************
*/
void RTGGCloseInput(void) {
if (RTGInputIO) {
if ((BOOL)CheckIO((struct IORequest *)RTGInputIO) == TRUE) {
AbortIO((struct IORequest *)RTGInputIO);
WaitIO((struct IORequest *)RTGInputIO);
}
CloseDevice((struct IORequest *)RTGInputIO);
DeleteExtIO((struct IORequest *)RTGInputIO);
DeletePort(RTGInputMsgPort);
}
if (ConsoleDevice) {
CloseDevice((struct IORequest *)&RTGConsoleIO);
ConsoleDevice = NULL;
}
}
/****** RTGGadgets/DrawRTGGList ******************************************
*
* NAME
* DrawRTGGList -- Draw a list of RTG Gadgets in their "up" position
*
* SYNOPSIS
* DrawRTGGList(list);
*
* DrawRTGGList(struct RTGGList *);
*
* FUNCTION
* Draw a list of RTG Gadgets in their "up" position :)
*
* INPUTS
* list - a pointer to an RTGGList structure
*
* RESULT
*
*****************************************************************************
*/
void DrawRTGGList(struct RTGGList *list) {
struct RTGGadget *akt;
if (!list) return;
for(akt = list->gl_First; akt; akt = akt->rg_Next)
RTGGUpRender(list, akt);
}